Oracle分组查询group by的用法及讲解 |
您所在的位置:网站首页 › group by用法示例 › Oracle分组查询group by的用法及讲解 |
Oracle分组查询group by的用法及讲解 Oracle分组查询group by的用法及讲解 (baidu.com) group by是sql中比较强大的功能,是在对数据分组统计时必不可少的用法。但是,对于很多经验不足的同学,经常会写错。今天我们就以Oracle为例,来讲解下分组查询group by的用法。 ![]() 一,group by 语法规范 首先我们准备一张Student表 CREATE TABLE STUDENT ( SNO VARCHAR2(10) not null, SNAME VARCHAR2(20), SAGE NUMBER(2), SSEX VARCHAR2(5) ) 往里面插入几条学生实体记录。再查看数据: SELECT * FROM STUDENT; ![]() 我们使用group by将这些数据按照性别进行分组: SELECT * FROM STUDENT GROUP BY SSEX; 不幸的是,执行失败了,提示:不是 GROUP BY 表达式! ![]() 原因是group by 分组查询,select子句后的字段必须来自group by后的分组字段。于是 我们执行SQL SELECT SSEX FROM STUDENT GROUP BY SSEX; ![]() 这下成功地将数据分为了两组。我们接下来使用下聚合函数 SELECT SSEX,MAX(SAGE) FROM STUDENT GROUP BY SSEX; 注意这条sql语句,select子句中聚合函数使用了SAGE(年龄)这个字段,那会不会违背了前面所说的 “select子句后的字段必须来自group by后的分组字段”这个规律呢,我们来执行一下: ![]() 能正常执行,成功地按照了性别分组,并且查询出了性别对应年龄最大的学生。于是我们可以得出规律:select子句后的任一非聚合函数字段都应来源于group by 分组语句后,否则语法会编译不通过。 二,group by 用法的意义 我们都知道group by 是用来分组的,那么具体怎么分组,对应的语句又怎么写呢?我们一起来研究下。 示例:按照年龄将学生分组。 很多人会这样写: SELECT * FROM STUDENT GROUP BY SSAGE 上面已经证实过了,这样子语法不通过。 SELECT SSAGE FROM STUDENT GROUP BY SSAGE 如果这样写的话,也只会单纯地将年龄分组。 ![]() 正确的写法是这样的: SELECT SNAME,SAGE FROM STUDENT GROUP BY SAGE,SNAME ORDER BY SAGE; ![]() 可以看出,group by 分组是按照group by后的字段组合来进行分组的。也就是说你group by后给了我几个字段,我就按照这几个字段组合成一条记录,若有重复的记录,就属于同一组,最后将所有的分组返回给你。 同时上诉sql的order by语句也要符合group by的语法,即order by后的字段必须来源于group by分组字段。所以我们可以把分出来的组理解为试图,所有的其他操作都基于这张视图。 三,分组查询的筛选where和having 示例:查询出性别为男的学生并按照年龄分组,并筛选出年龄大于21岁的 我们首先实现钱半部分:查询出性别为男的学生并按照年龄分组 SELECT SNAME,SAGE FROM STUDENT where SSEX='男' GROUP BY SNAME,SAGE ![]() 然后使用having语句筛选: SELECT SNAME,SAGE FROM STUDENT where SSEX='男' GROUP BY SNAME,SAGE HAVING SAGE>'21' 查询结果: ![]() 可以看到,小于等于21岁的男同学都被过滤掉了。 我们这里可以进行总结下: 1. 当在一个SQL中同时使用where和group by和having子句时,其执行顺序为:where>group by>having。 2. 同时where子句作用于表或者视图,having子句作用于组,having子句必须作用在group by之后。 以上三点就是分组查询group by的用法及讲解。希望大家多多练习,多多实践。温故而知新! 最后祝大家身体健康,财源滚滚! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |